package org.wdcode.common.config;

import java.io.File;

import org.apache.commons.configuration.ConfigurationException;

import org.wdcode.common.constants.FileConstants;
import org.wdcode.common.constants.StringConstants;
import org.wdcode.common.constants.WdErrorMessage;
import org.wdcode.common.exception.CustomRuntimeException;
import org.wdcode.common.util.StringUtil;

/**
 * 获得配置管理类ConfigManage的工厂<br/>
 * 使用buildXXX(X)获得ConfigManage实例<br/>
 * <h2>注: 使用本类需依赖 Apache Commons-Configuration包</h2>
 * @see org.wdcode.common.config.ConfigManage
 * @author WD
 * @since JDK6
 * @version 1.0 2009-03-25
 */
public final class ConfigManageFactory {
	/**
	 * 根据传入的文件名,生成不同实例。根据文件后缀名判断,现在只支持xml和properties
	 * @param fileName 文件名
	 * @return ConfigManage 实例
	 */
	public final static ConfigManage build(String fileName) {
		// 获得文件后缀
		String name = StringUtil.subStringLast(fileName, StringConstants.POINT).toLowerCase();
		// 判断文件类型
		if (FileConstants.SUFFIX_XML.equals(name)) {
			// xml文件
			return buildXMLConfig(fileName);
		} else if (FileConstants.SUFFIX_PROPERTIES.equals(name)) {
			// properties文件
			return buildPropertiesConfig(fileName);
		} else {
			// 抛出异常 文件格式不对
			throw new CustomRuntimeException(WdErrorMessage.FILE_FORMAT_ERROR);
		}
	}

	/**
	 * 根据文件名获得XML配置文件
	 * @param fileName xml文件名
	 * @return ConfigManage 实例
	 */
	public final static ConfigManage buildXMLConfig(String fileName) {
		try {
			return new XMLConfig(fileName);
		} catch (ConfigurationException e) {
			throw new CustomRuntimeException(e);
		}
	}

	/**
	 * 根据文件获得XML配置文件
	 * @param file XML文件
	 * @return ConfigManage 实例
	 */
	public final static ConfigManage buildXMLConfig(File file) {
		try {
			return new XMLConfig(file);
		} catch (ConfigurationException e) {
			throw new CustomRuntimeException(e);
		}
	}

	/**
	 * 根据文件名获得Properties配置文件
	 * @param fileName Properties文件名
	 * @return ConfigManage 实例
	 */
	public final static ConfigManage buildPropertiesConfig(String fileName) {
		try {
			return new PropertiesConfig(fileName);
		} catch (ConfigurationException e) {
			throw new CustomRuntimeException(e);
		}
	}

	/**
	 * 根据文件获得Properties配置文件
	 * @param file Properties文件
	 * @return ConfigManage 实例
	 */
	public final static ConfigManage buildPropertiesConfig(File file) {
		try {
			return new PropertiesConfig(file);
		} catch (ConfigurationException e) {
			throw new CustomRuntimeException(e);
		}
	}

	/**
	 * 私有构造 禁止外部实例化
	 */
	private ConfigManageFactory() {}
}
